﻿using System.Collections.Generic;
using System.Globalization;
using System.Linq;

using MCDomain.DataAccess;
using McReports.Common;
using MCDomain.Model;
using McUIBase.ViewModel;
using System.Diagnostics.Contracts;

namespace McReports.ViewModel
{
    public abstract class BaseReportViewModel : RepositoryViewModel
    {
        public int Measure
        {
            get { return 1000; }
        
        }

        public virtual void SetReport() { }

        protected virtual void BuildReport() { }

        protected virtual NumberFormatInfo NumberFormat
        {
            get { return CultureInfo.CurrentCulture.NumberFormat ; }
        }

        protected abstract string ReportFileName { get; }

        
        /// <summary>
        /// Получает или устанавливает провайдер шаблона для отчёта
        /// </summary>
        public ITemplateProvider TemplateProvider
        {
            get; set;
        }

        private IEnumerable<IContractStateData> _inputcontractdocs;

        /// <summary>
        /// Получает или устанавливает провайдер коллекции договоров для отчёта
        /// </summary>
        public IReportSourceProvider ReportSource
        {
            get;
            set;
        }
        
        /// <summary>
        /// Получает коллекцию договоров для отчёта с использованием провайдера
        /// </summary>
        public IEnumerable<IContractStateData> InputContractdocs
        {
            get
            {
                
                Contract.Requires(ReportSource != null);
                return _inputcontractdocs ?? (_inputcontractdocs = ReportSource.Source);                
            }
        }


        private IEnumerable<Contractdoc> _activeContractdocs;
 
        /// <summary>
        /// Получает договора подлежащие сдаче в отчетном периоде, 
        /// просроченные и ожидающие выполнения (последние с суммой 0)
        /// </summary>
        public IEnumerable<Contractdoc> ActiveContractDocs
        {
            get
            {
                if (_activeContractdocs != null) return _activeContractdocs;
                _activeContractdocs = Repository.Contracts.Where(p => (InputContractdocs.Count(x => x.Id == p.Id) > 0));
                return _activeContractdocs;
            }
           
        }

        /// <summary>
        /// Получает или устанавливает признак необходимости запрашивать входные параметры
        /// </summary>
        public bool NeedsInputParameters { get; set; }

        /// <summary>
        /// Получает описание свойств, которые являются входными параметрами отчёта
        /// </summary>
        public IEnumerable<ReportParameter> Parameters
        {
            get
            {
                var pi = GetType().GetProperties();
                return from propertyInfo in pi
                       let attr = propertyInfo.GetCustomAttributes(typeof (InputParameterAttribute), true)
                       where attr.Length == 1
                       select new ReportParameter((InputParameterAttribute) attr[0], propertyInfo.Name);
            }
        }


        /// <summary>
        /// Получает полный путь к шаблону отчёта с использованием провайдера и свойства ReportFileName
        /// </summary>
        public string ReportTemplate
        {
            get
            {
                Contract.Requires(TemplateProvider!=null);
                return TemplateProvider.GetTemplate(ReportFileName);
            }
        }

       protected BaseReportViewModel(IContractRepository repository)
            : base(repository)
       {
           NeedsInputParameters = false;
       }

       protected override void Save()
       {

       }

       protected override bool CanSave()
       {
           return false;
       }

     

       protected virtual void SetHeader()
       { }

      


    }
}
